package com.gzc.just.play.last.war.common.registry;

import com.gzc.just.play.last.war.common.distributed.ServiceInstance;

import java.util.List;
import java.util.function.Consumer;

/**
 * 服务发现接口
 * 用于从注册中心发现服务实例
 */
public interface ServiceDiscovery {
    
    /**
     * 获取指定服务的所有实例
     * 
     * @param serviceName 服务名称
     * @return 服务实例列表
     * @throws Exception 查询失败时抛出异常
     */
    List<ServiceInstance> getInstances(String serviceName) throws Exception;
    
    /**
     * 获取指定服务的健康实例
     * 
     * @param serviceName 服务名称
     * @return 健康的服务实例列表
     * @throws Exception 查询失败时抛出异常
     */
    List<ServiceInstance> getHealthyInstances(String serviceName) throws Exception;
    
    /**
     * 订阅服务变更通知
     * 
     * @param serviceName 服务名称
     * @param listener 变更监听器
     * @throws Exception 订阅失败时抛出异常
     */
    void subscribe(String serviceName, Consumer<List<ServiceInstance>> listener) throws Exception;
    
    /**
     * 取消订阅服务变更通知
     * 
     * @param serviceName 服务名称
     * @throws Exception 取消订阅失败时抛出异常
     */
    void unsubscribe(String serviceName) throws Exception;
    
    /**
     * 关闭服务发现连接
     */
    void close();
}
